/*
 * Classe para fazer associação das posições no tabuleiro com seus respectivos 
 * pontos na imagem
 * 
 * obs.:    - pontos precisam ser melhor definidos ainda, alguns estão errados ou faltando
 *          - pontos das bases para jogadores estão errados
 */
package view;

import java.awt.Point;
import java.util.ArrayList;
import sun.security.jca.GetInstance;

public class MapeiaTabuleiro {
    private static final MapeiaTabuleiro map = new MapeiaTabuleiro();
    private ArrayList<ParPontos> pontos;
    
    public MapeiaTabuleiro() {
        
        pontos = new ArrayList<ParPontos>();
        
        // começando a listar a partir das posições dos peões nas suas respectivas bases no tabuleiro
        // após a definição das bases é listado as casas do tabuleiro a partir do ponto (1,8)
        // em sentido horário, para ver as posições veja: /ludo_online.view.imagens/map_virtual_tabuleiro.jpg
        // Base do jogador 1
        pontos.add(new ParPontos(1, 12, 95,  105)); // peão 1 // [0]
        pontos.add(new ParPontos(3, 12, 160, 105)); // peão 2 // [1]
        pontos.add(new ParPontos(3, 10, 111, 240)); // peão 3 // [2]
        pontos.add(new ParPontos(1, 10, 111, 240)); // peão 4 // [3]
        // Base do jogador 2
        pontos.add(new ParPontos(10, 12, 111, 240)); // [4]
        pontos.add(new ParPontos(12, 12, 111, 240)); // [5]  
        pontos.add(new ParPontos(12, 10, 111, 240)); // [6]
        pontos.add(new ParPontos(10, 10, 111, 240)); // [7] 
        // Base do jogador 3
        pontos.add(new ParPontos(10, 3, 111, 240)); //  [8]
        pontos.add(new ParPontos(12, 3, 111, 240)); //  [9]
        pontos.add(new ParPontos(12, 1, 111, 240)); //  [10]
        pontos.add(new ParPontos(10, 1, 111, 240)); //  [11]
        // Base do jogador 4
        pontos.add(new ParPontos(1, 3, 111, 240)); //   [12] 
        pontos.add(new ParPontos(3, 3, 111, 240)); //   [13]
        pontos.add(new ParPontos(3, 1, 111, 240)); //   [14]
        pontos.add(new ParPontos(1, 1, 111, 240)); //   [15]
        // Casas do tabuleiro 
        pontos.add(new ParPontos( 1, 8, 68, 228));  // [16]
        pontos.add(new ParPontos( 2, 8, 106, 228)); // [17] //x-> +38
        pontos.add(new ParPontos( 3, 8, 144, 228)); // [18]
        pontos.add(new ParPontos( 4, 8, 182, 228)); // [19]
        pontos.add(new ParPontos( 5, 8, 220, 228)); // [20]
        pontos.add(new ParPontos( 5, 9, 220, 191)); // [21] // y->-37
        pontos.add(new ParPontos( 6, 9, 258, 191)); // [22]
        pontos.add(new ParPontos( 6, 10, 258, 154));// [23] 
        pontos.add(new ParPontos( 6, 11, 258, 117));// [24]
        pontos.add(new ParPontos( 6, 12, 258, 80)); // [25]  
        pontos.add(new ParPontos( 6, 13, 258, 43)); // [26]  
        pontos.add(new ParPontos( 6, 14, 258, 6));  // [27]  
        pontos.add(new ParPontos( 7, 14, 296, 6));  // [28]  
        pontos.add(new ParPontos( 8, 14, 334, 6));  // [29]  
        pontos.add(new ParPontos( 8, 13, 334, 43)); // [31]
        pontos.add(new ParPontos( 8, 12, 334, 80)); // [31]  
        pontos.add(new ParPontos( 8, 11, 334, 117));// [32]  
        pontos.add(new ParPontos( 8, 10, 334, 154));// [33]  
        pontos.add(new ParPontos( 8, 9, 334, 191)); // [34]  //
        pontos.add(new ParPontos( 9, 9, 372, 191)); // [35]  //
        pontos.add(new ParPontos( 9, 8, 372, 228)); // [36]  
        pontos.add(new ParPontos(10, 8, 410, 228)); // [37] 
        pontos.add(new ParPontos(11, 8, 448, 228)); // [38]  
        pontos.add(new ParPontos(12, 8, 486, 228)); // [39]  
        pontos.add(new ParPontos(13, 8, 524, 228)); // [40]  
        pontos.add(new ParPontos(14, 8, 562, 228)); // [41]  
        pontos.add(new ParPontos(14, 7, 562, 265)); // [42]  
        pontos.add(new ParPontos(14, 6, 562, 302)); // [43]  
        pontos.add(new ParPontos(13, 6, 524, 302)); // [44]  
        pontos.add(new ParPontos(12, 6, 486, 302)); // [45]  
        pontos.add(new ParPontos(11, 6, 448, 302)); // [46]  
        pontos.add(new ParPontos(10, 6, 410, 302)); // [47]  
        pontos.add(new ParPontos( 9, 6, 372, 302)); // [48]
        pontos.add(new ParPontos( 8, 6, 372, 339)); // [49]
        pontos.add(new ParPontos( 8, 5, 334, 339)); // [50]
        pontos.add(new ParPontos( 8, 4, 334, 376)); // [51]
        pontos.add(new ParPontos( 8, 3, 334, 413)); // [52]
        pontos.add(new ParPontos( 8, 2, 334, 450)); // [53]
        pontos.add(new ParPontos( 8, 1, 334, 487)); // [54]
        pontos.add(new ParPontos( 8, 0, 334, 524)); // [55]
        pontos.add(new ParPontos( 7, 0, 296, 524)); // [56]
        pontos.add(new ParPontos( 6, 0, 258, 524)); // [57]
        pontos.add(new ParPontos( 6, 1, 258, 487)); // [58]
        pontos.add(new ParPontos( 6, 2, 258, 450)); // [59]
        pontos.add(new ParPontos( 6, 3, 258, 413)); // [60]
        pontos.add(new ParPontos( 6, 4, 258, 376)); // [61]
        pontos.add(new ParPontos( 6, 5, 258, 339)); // [62]
        pontos.add(new ParPontos( 5, 5, 220, 339)); // [63]
        pontos.add(new ParPontos( 5, 6, 220, 302)); // [64]
        pontos.add(new ParPontos( 4, 6, 182, 302)); // [65]
        pontos.add(new ParPontos( 3, 6, 144, 302)); // [66]
        pontos.add(new ParPontos( 2, 6, 106, 302)); // [67]
        pontos.add(new ParPontos( 1, 6, 68, 302));  // [68]
        pontos.add(new ParPontos( 0, 6, 30, 302));  // [69]
        pontos.add(new ParPontos( 0, 7, 30, 265)); // [70]
        pontos.add(new ParPontos( 0, 8, 30, 228)); // [71]
        
        // mapeamento das faixas de segurança, iniciando do jogador 1
        pontos.add(new ParPontos( 1, 7, 30, 265)); // [72]
        pontos.add(new ParPontos( 2, 7, 68, 265)); // [73]
        pontos.add(new ParPontos( 3, 7, 106, 265)); // [74]
        pontos.add(new ParPontos( 4, 7, 144, 265)); // [75]
        pontos.add(new ParPontos( 5, 7, 182, 265)); // [76]
         pontos.add(new ParPontos( 6, 7, 220, 265)); // [77]
        
        pontos.add(new ParPontos( 7, 13, 296, 43)); // [78]
        pontos.add(new ParPontos( 7, 12, 296, 80)); // [79]
        pontos.add(new ParPontos( 7, 11, 296, 117)); // [80]
        pontos.add(new ParPontos( 7, 10, 296, 154)); // [81]
        pontos.add(new ParPontos( 7, 9, 296, 191)); // [82]
        pontos.add(new ParPontos( 7, 8, 296, 228)); // [83]
        
        pontos.add(new ParPontos( 13, 7, 524, 265)); // [84]
        pontos.add(new ParPontos( 12, 7, 486, 265)); // [85]
        pontos.add(new ParPontos( 11, 7, 448, 265)); // [86]
        pontos.add(new ParPontos( 10, 7, 410, 265)); // [87]
        pontos.add(new ParPontos( 9, 7, 372, 265)); // [88]
        pontos.add(new ParPontos( 8, 7, 334, 265)); // [89]
        
        pontos.add(new ParPontos( 7, 1, 296, 487)); // [90]
        pontos.add(new ParPontos( 7, 2, 296, 450)); // [91]
        pontos.add(new ParPontos( 7, 3, 296, 413)); // [92]
        pontos.add(new ParPontos( 7, 4, 296, 376)); // [93]
        pontos.add(new ParPontos( 7, 5, 296, 339)); // [94]
        pontos.add(new ParPontos( 7, 6, 296, 302)); // [95]
    }
    
    public static MapeiaTabuleiro getInstance(){
        return map;
    }
    
    // busca ponto virtual na lista retorna o seu indice (posição na lista)
    public int getIndicePontoVirtual(Point p){
        for (int i = 0; i < pontos.size(); i++) {
            if(pontos.get(i).getPontoVirtual().equals(p)){
                return i;
            }
        }
        return 0;
    }        
    
    // busca ponto virtual de acordo com o indice na lista
    public Point getPontoVirtual(int i){
        return pontos.get(i).getPontoVirtual();
    }
    
    // busca ponto na figura de acordo com o indice na lista
    public Point getPontoFigura(int i){
        return pontos.get(i).getPontoFigura();
    }
    
    // busca ponto na figura de acordo com o ponto virtual
    public Point getPontoFigura(int x, int y){
        for (int i = 0; i < pontos.size(); i++) {
            if((pontos.get(i).getPontoVirtual().getX() == x) && (pontos.get(i).getPontoVirtual().getY() == y)){
                 return pontos.get(i).getPontoFigura();
            }
        }
        return null;
    }
    
    // busca coodernada na figura por posição da casa
    public Point getCoordenada(int x, int y){
        ParPontos pPontos;
        
        for(int i = 0; i < pontos.size(); i++ ){  
            pPontos = pontos.get(i);
            
            if((pPontos.getPontoVirtual().getX() == x ) && (pPontos.getPontoVirtual().getY() == y)){
                return pPontos.getPontoFigura();
            }       
        }
        return null;
    }
    
    // Classe interna que associa ponto virtual a ponto na imagem
    public class ParPontos{
        private Point pontoVirtual, pontoFigura;

        public ParPontos(int x, int y, int xFig, int yFig) {
            pontoVirtual = new Point(x,y);
            pontoFigura = new Point(xFig, yFig);
        }
        
        public double getX(){
            return pontoVirtual.getX();
        }
        
        public double getY(){
            return pontoVirtual.getY();
        }
        
        public Point getPontoVirtual(){
            return pontoVirtual;
        }
        
        public double getXFig(){
            return pontoFigura.getX();
        }
        
        public double getYFig(){
            return pontoFigura.getY();
        }
        
        public Point getPontoFigura(){
            return pontoFigura;
        }     
    }
}
